#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @Project : chat_model 
# @File    : async_http_client_util.py
# @IDE     : PyCharm 
# @Author  :ZH
# @Time    : 2025/1/3 13:19
__all__ = ['async_http_client']

import httpx
from typing import Optional, Dict, Any


class AsyncHttpClient:
    def __init__(self, timeout: int = 10, headers: Optional[Dict[str, str]] = None):
        """
        初始化异步 HTTP 客户端。

        :param timeout: 请求超时时间（秒）。
        :param headers: 默认请求头。
        """
        self.headers = headers if headers else {}

    async def _request(self, method: str, url: str, timeout: int = 50, **kwargs) -> Any:
        """
        发送异步 HTTP 请求。

        :param method: HTTP 方法（如 'GET', 'POST'）。
        :param url: 请求的 URL。
        :param kwargs: 其他请求参数（如 headers, json, params 等）。
        :return: 响应的 JSON 数据。
        """
        # 合并默认请求头和自定义请求头
        headers = {**self.headers, **kwargs.pop('headers', {})}

        async with httpx.AsyncClient(timeout=timeout, verify=False) as client:
            try:
                response = await client.request(method, url, headers=headers, **kwargs)
                print(response.text)
                response.raise_for_status()  # 如果响应状态码不是 2xx，抛出异常
                return response.json()  # 返回 JSON 数据
            except httpx.HTTPStatusError as e:
                print(f"HTTP error occurred: {e}")
                raise
            except httpx.RequestError as e:
                print(f"Request failed: {e}")
                raise
            except Exception as e:
                print(f"An error occurred: {e}")
                raise

    async def get(self, url: str, params: Optional[Dict[str, Any]] = None, **kwargs) -> Any:
        """
        发送 GET 请求。

        :param url: 请求的 URL。
        :param params: 查询参数。
        :param kwargs: 其他请求参数。
        :return: 响应的 JSON 数据。
        """
        return await self._request('GET', url, params=params, **kwargs)

    async def post(self, url: str, data: Optional[Dict[str, Any]] = None, json: Optional[Dict[str, Any]] = None,
                   **kwargs) -> Any:
        """
        发送 POST 请求。

        :param url: 请求的 URL。
        :param data: 表单数据。
        :param json: JSON 数据。
        :param kwargs: 其他请求参数。
        :return: 响应的 JSON 数据。
        """
        return await self._request('POST', url, data=data, json=json, **kwargs)

    async def put(self, url: str, data: Optional[Dict[str, Any]] = None, json: Optional[Dict[str, Any]] = None,
                  **kwargs) -> Any:
        """
        发送 PUT 请求。

        :param url: 请求的 URL。
        :param data: 表单数据。
        :param json: JSON 数据。
        :param kwargs: 其他请求参数。
        :return: 响应的 JSON 数据。
        """
        return await self._request('PUT', url, data=data, json=json, **kwargs)

    async def delete(self, url: str, **kwargs) -> Any:
        """
        发送 DELETE 请求。

        :param url: 请求的 URL。
        :param kwargs: 其他请求参数。
        :return: 响应的 JSON 数据。
        """
        return await self._request('DELETE', url, **kwargs)

    async def patch(self, url: str, data: Optional[Dict[str, Any]] = None, json: Optional[Dict[str, Any]] = None,
                    **kwargs) -> Any:
        """
        发送 PATCH 请求。

        :param url: 请求的 URL。
        :param data: 表单数据。
        :param json: JSON 数据。
        :param kwargs: 其他请求参数。
        :return: 响应的 JSON 数据。
        """
        return await self._request('PATCH', url, data=data, json=json, **kwargs)


async_http_client = AsyncHttpClient()
